using System;
using Csla;
using Ent.AccesoDatos;
using System.Collections.Generic;
using System.Data;

namespace EntGuayasSLA.BL
{
    [Serializable]
    public class ArchivosRevisar:
      BusinessListBase<ArchivosRevisar, ArchivoRevisar>
    {
        #region Factory Methods

        internal static ArchivosRevisar NewArchivosRevisar()
        {
            return DataPortal.CreateChild<ArchivosRevisar>();
        }

        internal static ArchivosRevisar GetArchivosRevisar(Guid Id)
        {
            return DataPortal.FetchChild<ArchivosRevisar>(Id);
        }

        private ArchivosRevisar()
        { 
        
        }

        #endregion

        #region Data Access

        private void Child_Fetch(Guid criteria)
        {
            RaiseListChangedEvents = false;
          
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> 
                    {
                        new Parametro("ec_ref_id", criteria.ToString())
                    };
            DataSet datos = accesoDatos.EjecutarDataSet("\"OBT_ARCHIVOS_REVISAR_ALL\"", parametros);
            foreach (DataRow items in datos.Tables[0].Rows)
            {
                this.Add(ArchivoRevisar.GetArchivoRevisar(items));
            }
           
            RaiseListChangedEvents = true;
        }

        #endregion
    }


    [Serializable]
    public class ArchivoRevisar : BusinessBase<ArchivoRevisar>
    {
        #region Business Methods

        private static PropertyInfo<Guid> IdProperty = RegisterProperty<Guid>(c => c.Id);
        public Guid Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }
        public static readonly PropertyInfo<Guid> ArchivoIdProperty = RegisterProperty<Guid>(c => c.ArchivoId);
        public Guid ArchivoId
        {
            get { return GetProperty(ArchivoIdProperty); }
            set { SetProperty(ArchivoIdProperty, value); }
        }
      

        public static readonly PropertyInfo<string> ComentarioProperty = RegisterProperty<string>(c => c.Comentario);
        public string Comentario
        {
            get { return GetProperty(ComentarioProperty); }
            set { SetProperty(ComentarioProperty, value); }
        }


        public static readonly PropertyInfo<string> RevisionFaseIdProperty = RegisterProperty<string>(c => c.RevisionFaseId);
        public string RevisionFaseId 
        {
            get { return GetProperty(RevisionFaseIdProperty); }
            set { SetProperty(RevisionFaseIdProperty, value); }
        }
        public static readonly PropertyInfo<string> AprobadoProperty = RegisterProperty<string>(c => c.Aprobado);
        public string Aprobado
        {
            get { return GetProperty(AprobadoProperty); }
            set { SetProperty(AprobadoProperty, value); }
        }

        public ArchivoRevisar()
        {
            MarkAsChild();
        }
        #endregion

        #region Validation Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            //ValidationRules.AddRule(RuleMethod, "");
        }

        #endregion

        #region Authorization Rules

        
        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //BusinessRules.AddRule(...);
        }

        #endregion

        #region Factory Methods

        internal static ArchivoRevisar NewArchivoRevisar()
        {
            return DataPortal.CreateChild<ArchivoRevisar>();
        }

        internal static ArchivoRevisar GetArchivoRevisar(DataRow childData)
        {
            return DataPortal.FetchChild<ArchivoRevisar>(childData);
        }

     

        #endregion

        #region Data Access

        protected override void Child_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.Child_Create();
        }

        private void Child_Fetch(DataRow childData)
        {

            LoadProperty(IdProperty, Guid.Parse(childData["are_id"].ToString()));
            LoadProperty(ArchivoIdProperty, Guid.Parse(childData["arc_id"].ToString()));
            LoadProperty(ComentarioProperty, childData["are_comentario"].ToString());
            LoadProperty(RevisionFaseIdProperty, childData["ref_id"].ToString());
            LoadProperty(AprobadoProperty, childData["are_aprobado"].ToString());
            
        }

        private void Child_Insert(Guid parent)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { 
                new Parametro("ec_are_id", ReadProperty(IdProperty).ToString()),
                new Parametro("ec_arc_id", ReadProperty(ArchivoIdProperty)),
                new Parametro("ec_are_comentario", ReadProperty(ComentarioProperty)),
                new Parametro("ec_ref_id", parent.ToString()),
                new Parametro("ec_are_aprobado", ReadProperty(AprobadoProperty))
            };
            accesoDatos.EjecutarQuery("\"INS_ARCHIVOS_REVISAR\"", parametros);
        }

        private void Child_Update(object parent)           
        {


            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { 
              new Parametro("ec_are_id", ReadProperty(IdProperty).ToString()),
              new Parametro("ec_arc_id", ReadProperty(ArchivoIdProperty)),
              new Parametro("ec_are_comentario", ReadProperty(ComentarioProperty)),
              new Parametro("ec_ref_id", ReadProperty(RevisionFaseIdProperty)),
              new Parametro("ec_are_aprobado", ReadProperty(AprobadoProperty))
            };
            accesoDatos.EjecutarQuery("\"ACT_ARCHIVOS_REVISAR\"", parametros);
           
        }

        private void Child_DeleteSelf(object parent)
        {
            DataPortal_Delete(this.Id);
        }
        [Transactional(TransactionalTypes.TransactionScope)]
        private void DataPortal_Delete(Guid criteria)
        {

            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { 
                new Parametro("ec_are_id", ReadProperty(IdProperty).ToString())
            };
            accesoDatos.EjecutarQuery("\"ELI_ARCHIVOS_REVISAR\"", parametros);

        }
        #endregion
    }
}
